package com.ccp.dev.workflow.service;

import com.ccp.dev.core.basic.base.BaseService;
import com.ccp.dev.core.basic.util.UUIDUtils;
import com.ccp.dev.workflow.dao.BpmNodeScriptDao;
import com.ccp.dev.workflow.model.BpmNodeScript;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * ClassDescribe:流程节点事件脚本 Service
 * @author :jiayueqiao
 * Date: 2019-07-03
 * Since:1
 */
@Service
public class BpmNodeScriptService extends BaseService<BpmNodeScript> {

    @Resource
    private BpmNodeScriptDao bpmNodeScriptDao;

    /**
     * 根据节点和事件类型获取脚本。
     * @param nodeId 节点id
     * @param procDefId 流程定义id
     * @param scriptType 脚本类型
     * @return 脚本
     */
    public BpmNodeScript getScriptByType(String nodeId,String procDefId,Integer scriptType){
        Map<String,Object> params=new HashMap<>(3);
        params.put("procDefId", procDefId);
        params.put("nodeId", nodeId);
        params.put("scriptType", scriptType);
        return bpmNodeScriptDao.getScriptByType(params);
    }

    /**
     * 根据流程定义id和流程节点id获取脚本放到一个map中。
     * @param nodeId 节点id
     * @param procDefId 流程定义id
     * @return 脚本
     */
    public Map<String,String> getMapByNodeIdAndProcDefId(String nodeId,String procDefId){
        List<BpmNodeScript> list=this.getBpmNodeScript(nodeId, procDefId);
        Map<String, String> map=new HashMap<>(15);
        for(BpmNodeScript script:list){
            map.put("type" + script.getScriptType(), script.getScript());
        }

        return map;
    }

    /**
     * 根据节点id获取脚本。
     * @param nodeId 节点id
     * @param procDefId 流程定义id
     * @return 脚本列表
     */
    private List<BpmNodeScript> getBpmNodeScript(String nodeId,String procDefId){
        return bpmNodeScriptDao.queryBpmNodeScript(nodeId,procDefId);
    }

    /**
     * 保存流程节点定义
     * @param defId 模型定义id
     * @param nodeId 节点id
     * @param list 脚本
     */
    @Transactional(rollbackFor = Exception.class)
    public void saveScriptDef(String defId,String nodeId,List<BpmNodeScript> list){
        //先删除
        this.delByDefAndNodeId(defId,nodeId);
        //再重新添加
        for(BpmNodeScript script:list){
            String id = UUIDUtils.getUUIDFor32();
            script.setId(id);
            script.setProcDefId(defId);
            script.setNodeId(nodeId);
            bpmNodeScriptDao.add(script);
        }

    }

    /**
     * 根据流程定义ID和节点ID删除脚本数据。
     * @param nodeId 节点id
     * @param procDefId 流程定义id
     */
    @Transactional(rollbackFor = Exception.class)
    public void delByDefAndNodeId(String procDefId,String nodeId)
    {
        Map<String,Object> params=new HashMap<>(2);
        params.put("procDefId", procDefId);
        params.put("nodeId", nodeId);
        bpmNodeScriptDao.delByDefAndNodeId(params);
    }

    /**
     * 获取流程脚本
     * @param procDefId 流程定义id
     * @return 脚本列表
     */
    public List<BpmNodeScript> queryByProcDefId(String procDefId) {
        return bpmNodeScriptDao.queryByProcDefId(procDefId);
    }
}
